/**
 * 事件总线
 * 使用观察者模式实现组件间通信
 */

class EventBus {
  constructor() {
    this.events = {}
  }
  
  /**
   * 订阅事件
   * @param {string} event 事件名称
   * @param {Function} callback 回调函数
   */
  on(event, callback) {
    if (!this.events[event]) {
      this.events[event] = []
    }
    this.events[event].push(callback)
  }
  
  /**
   * 取消订阅事件
   * @param {string} event 事件名称
   * @param {Function} callback 回调函数
   */
  off(event, callback) {
    if (this.events[event]) {
      const index = this.events[event].indexOf(callback)
      if (index > -1) {
        this.events[event].splice(index, 1)
      }
      
      // 如果事件数组为空，删除该事件
      if (this.events[event].length === 0) {
        delete this.events[event]
      }
    }
  }
  
  /**
   * 触发事件
   * @param {string} event 事件名称
   * @param {any} data 数据
   */
  emit(event, data) {
    if (this.events[event]) {
      this.events[event].forEach(callback => {
        try {
          callback(data)
        } catch (error) {
          console.error(`事件${event}处理错误:`, error)
        }
      })
    }
  }
  
  /**
   * 订阅一次事件
   * @param {string} event 事件名称
   * @param {Function} callback 回调函数
   */
  once(event, callback) {
    const onceCallback = (data) => {
      callback(data)
      this.off(event, onceCallback)
    }
    this.on(event, onceCallback)
  }
}

// 导出单例实例
const eventBus = new EventBus()
export default eventBus